#ifndef VECTOR3_H_
#define VECTOR3_H_
#include <math.h>

namespace Pantsu
{
	/*/////////////////////////////////////////////////////////////////////////
 
	Vector3:
	
	Our Classic vector3 class
	/////////////////////////////////////////////////////////////////////////*/
	class Vector3 {

	public:
		float X;
		float Y;
		float Z;

	public:
		inline  Vector3()
			: X(0.0f),
			  Y(0.0f),
			  Z(0.0f)
		{
			
		}

		inline Vector3(const float x, const float y, const float z)
			: X(x),
		      Y(y),
			  Z(z)
		{
			
		}
		
		inline Vector3(const Vector3 &Vsrc)
		{
			X = Vsrc.X;
			Y = Vsrc.Y;
			Z = Vsrc.Z;
		}

		~Vector3(){};

		/* operators */
		inline Vector3 &operator =(const Vector3 &Vsrc)
		{
			X = Vsrc.X;
			Y = Vsrc.Y;
			Z = Vsrc.Z;
			return *this;
		}

		inline bool operator==(Vector3 &Vsrc)
		{
			return (X == Vsrc.X && Y == Vsrc.Y && Vsrc.Z);
		}

		void operator *= ( const float value ) {
			X *= value;
			Y *= value;
			Z *= value;
		}

		void operator += ( const Vector3 &Vsrc ) {

			X += Vsrc.X;
			Y += Vsrc.Y;
			Z += Vsrc.Z;
		}

		Vector3 operator + ( const Vector3& v ) const
        {
            return Vector3( X + v.X, Y + v.Y, Z + v.Z);
        }

		void operator -= ( const Vector3 &Vsrc ) {
			X -= Vsrc.X;
			Y -= Vsrc.Y;
			Z -= Vsrc.Z;
		}
		
		Vector3 operator * (const float value) const {
            return Vector3( X * value, Y * value, Z * value);
        }

		float operator * ( const Vector3 &Vsrc ) {
			return X * Vsrc.X + Y * Vsrc.Y + Z * Vsrc.Z;
		}

		/* Utility */
		void AddScaledVector(const Vector3 &Vsrc, const float iScale)
		{
			X += Vsrc.X * iScale;
			Y += Vsrc.Y * iScale;
			Z += Vsrc.Z * iScale;
		}

		inline Vector3 Normalized() {
			float lenght = sqrt( X * X + Y * Y + Z * Z );
			return Vector3( X / lenght, Y / lenght, Z / lenght );
		}

		void Clear()
		{
			X = 0.0f;
			Y = 0.0f;
			Z = 0.0f;
		}
	};
}
#endif